#include <iostream>
#include <thread>
#include <shared_mutex>
#include <vector>
#include <mutex>
// 读写锁同步原语，适用于读多写少的并发场景。它通过区分“共享锁”和“独占锁”两种访问级别，在保证数据一致性的前提下允许多个线程并发读取，从而提升程序吞吐量
// 1、读进程并发
// 2、写进程互斥
// 3、读写进程互斥
// 4、避免读/写进程饿死
std::shared_mutex rw_mtx; // 读写锁
int value = 0;            // 共享数据

void reader(int id)
{
    std::shared_lock sl(rw_mtx); // 共享读
    std::cout << "[reader " << id << "] read value = " << value << '\n';
}

void writer(int id)
{
    std::unique_lock ul(rw_mtx); // 独占写
    ++value;
}

int main()
{
    std::vector<std::thread> threads;

    // 启动 10 个读线程
    for (int i = 0; i < 10; ++i)
        threads.emplace_back(reader, i);

    // 启动 5 个写线程
    for (int i = 0; i < 5; ++i)
        threads.emplace_back(writer, i);

    // 等待全部结束
    for (auto &t : threads)
        t.join();

    std::cout << "final value = " << value << '\n';
    return 0;
}